home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / atarist / usub / acurses.mus next >
Encoding:
Text File  |  1992-08-08  |  13.1 KB  |  705 lines

  1. /* $RCSfile: acurses.mus,v $$Revision: 4.1 $$Date: 92/08/07 17:19:04 $
  2.  *
  3.  * $Log:    acurses.mus,v $
  4.  * Revision 4.1  92/08/07  17:19:04  lwall
  5.  * Stage 6 Snapshot
  6.  * 
  7.  * Revision 4.0.1.1  92/06/08  11:54:30  lwall
  8.  * Initial revision
  9.  * 
  10.  * Revision 4.0.1.1  91/11/05  19:04:53  lwall
  11.  * initial checkin
  12.  * 
  13.  * Revision 4.0  91/03/20  01:56:13  lwall
  14.  * 4.0 baseline.
  15.  * 
  16.  * Revision 3.0.1.1  90/08/09  04:05:21  lwall
  17.  * patch19: Initial revision
  18.  * 
  19.  */
  20.  
  21. #include "EXTERN.h"
  22. #include "perl.h"
  23.  
  24. char *savestr();
  25.  
  26. #ifdef atarist    /* save and restore definition of VOID around curses.h */
  27. # define __SAVEVOID VOID
  28. # undef  VOID
  29. #endif
  30.  
  31. #include <curses.h>
  32.  
  33. static enum uservars {
  34.     UV_curscr,
  35.     UV_stdscr,
  36.     UV_Def_term,
  37.     UV_My_term,
  38.     UV_ttytype,
  39.     UV_LINES,
  40.     UV_COLS,
  41.     UV_ERR,
  42.     UV_OK,
  43. };
  44.  
  45. static enum usersubs {
  46.     US_addch,
  47.     US_waddch,
  48.     US_addstr,
  49.     US_waddstr,
  50.     US_box,
  51.     US_clear,
  52.     US_wclear,
  53.     US_clearok,
  54.     US_clrtobot,
  55.     US_wclrtobot,
  56.     US_clrtoeol,
  57.     US_wclrtoeol,
  58.     US_delch,
  59.     US_wdelch,
  60.     US_deleteln,
  61.     US_wdeleteln,
  62.     US_erase,
  63.     US_werase,
  64.     US_flushok,
  65.     US_idlok,
  66.     US_insch,
  67.     US_winsch,
  68.     US_insertln,
  69.     US_winsertln,
  70.     US_move,
  71.     US_wmove,
  72.     US_overlay,
  73.     US_overwrite,
  74.     US_printw,
  75.     US_wprintw,
  76.     US_refresh,
  77.     US_wrefresh,
  78.     US_standout,
  79.     US_wstandout,
  80.     US_standend,
  81.     US_wstandend,
  82.     US_cbreak,
  83.     US_nocbreak,
  84.     US_echo,
  85.     US_noecho,
  86.     US_getch,
  87.     US_wgetch,
  88.     US_getstr,
  89.     US_wgetstr,
  90.     US_raw,
  91.     US_noraw,
  92.     US_scanw,
  93.     US_wscanw,
  94.     US_baudrate,
  95.     US_delwin,
  96.     US_endwin,
  97.     US_erasechar,
  98.     US_getcap,
  99.     US_getyx,
  100.     US_inch,
  101.     US_winch,
  102.     US_initscr,
  103.     US_killchar,
  104.     US_leaveok,
  105.     US_longname,
  106.     US_fullname,
  107.     US_mvwin,
  108.     US_newwin,
  109.     US_nl,
  110.     US_nonl,
  111.     US_scrollok,
  112.     US_subwin,
  113.     US_touchline,
  114.     US_touchoverlap,
  115.     US_touchwin,
  116.     US_unctrl,
  117.     US_gettmode,
  118.     US_mvcur,
  119.     US_scroll,
  120.     US_savetty,
  121.     US_resetty,
  122.     US_setterm,
  123.     US_tstp,
  124.     US__putchar,
  125.     US_testcallback,
  126. };
  127.  
  128. static int usersub();
  129. static int userset();
  130. static int userval();
  131.  
  132. int
  133. init_curses()
  134. {
  135.     struct ufuncs uf;
  136.     char *filename = "curses.c";
  137.  
  138.     uf.uf_set = userset;
  139.     uf.uf_val = userval;
  140.  
  141. #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
  142.  
  143.     MAGICVAR("curscr",    UV_curscr);
  144.     MAGICVAR("stdscr",    UV_stdscr);
  145.     MAGICVAR("Def_term",UV_Def_term);
  146.     MAGICVAR("My_term",    UV_My_term);
  147.     MAGICVAR("ttytype",    UV_ttytype);
  148.     MAGICVAR("LINES",    UV_LINES);
  149.     MAGICVAR("COLS",    UV_COLS);
  150.     MAGICVAR("ERR",    UV_ERR);
  151.     MAGICVAR("OK",    UV_OK);
  152.  
  153.     make_usub("addch",        US_addch,    usersub, filename);
  154.     make_usub("waddch",        US_waddch,    usersub, filename);
  155.     make_usub("addstr",        US_addstr,    usersub, filename);
  156.     make_usub("waddstr",    US_waddstr,    usersub, filename);
  157.     make_usub("box",        US_box,        usersub, filename);
  158.     make_usub("clear",        US_clear,    usersub, filename);
  159.     make_usub("wclear",        US_wclear,    usersub, filename);
  160.     make_usub("clearok",    US_clearok,    usersub, filename);
  161.     make_usub("clrtobot",    US_clrtobot,    usersub, filename);
  162.     make_usub("wclrtobot",    US_wclrtobot,    usersub, filename);
  163.     make_usub("clrtoeol",    US_clrtoeol,    usersub, filename);
  164.     make_usub("wclrtoeol",    US_wclrtoeol,    usersub, filename);
  165.     make_usub("delch",        US_delch,    usersub, filename);
  166.     make_usub("wdelch",        US_wdelch,    usersub, filename);
  167.     make_usub("deleteln",    US_deleteln,    usersub, filename);
  168.     make_usub("wdeleteln",    US_wdeleteln,    usersub, filename);
  169.     make_usub("erase",        US_erase,    usersub, filename);
  170.     make_usub("werase",        US_werase,    usersub, filename);
  171.     make_usub("flushok",    US_flushok,    usersub, filename);
  172.     make_usub("idlok",        US_idlok,    usersub, filename);
  173.     make_usub("insch",        US_insch,    usersub, filename);
  174.     make_usub("winsch",        US_winsch,    usersub, filename);
  175.     make_usub("insertln",    US_insertln,    usersub, filename);
  176.     make_usub("winsertln",    US_winsertln,    usersub, filename);
  177.     make_usub("move",        US_move,    usersub, filename);
  178.     make_usub("wmove",        US_wmove,    usersub, filename);
  179.     make_usub("overlay",    US_overlay,    usersub, filename);
  180.     make_usub("overwrite",    US_overwrite,    usersub, filename);
  181.     make_usub("printw",        US_printw,    usersub, filename);
  182.     make_usub("wprintw",    US_wprintw,    usersub, filename);
  183.     make_usub("refresh",    US_refresh,    usersub, filename);
  184.     make_usub("wrefresh",    US_wrefresh,    usersub, filename);
  185.     make_usub("standout",    US_standout,    usersub, filename);
  186.     make_usub("wstandout",    US_wstandout,    usersub, filename);
  187.     make_usub("standend",    US_standend,    usersub, filename);
  188.     make_usub("wstandend",    US_wstandend,    usersub, filename);
  189.     make_usub("cbreak",        US_cbreak,    usersub, filename);
  190.     make_usub("nocbreak",    US_nocbreak,    usersub, filename);
  191.     make_usub("echo",        US_echo,    usersub, filename);
  192.     make_usub("noecho",        US_noecho,    usersub, filename);
  193.     make_usub("getch",        US_getch,    usersub, filename);
  194.     make_usub("wgetch",        US_wgetch,    usersub, filename);
  195.     make_usub("getstr",        US_getstr,    usersub, filename);
  196.     make_usub("wgetstr",    US_wgetstr,    usersub, filename);
  197.     make_usub("raw",        US_raw,        usersub, filename);
  198.     make_usub("noraw",        US_noraw,    usersub, filename);
  199.     make_usub("scanw",        US_scanw,    usersub, filename);
  200.     make_usub("wscanw",        US_wscanw,    usersub, filename);
  201.     make_usub("baudrate",    US_baudrate,    usersub, filename);
  202.     make_usub("delwin",        US_delwin,    usersub, filename);
  203.     make_usub("endwin",        US_endwin,    usersub, filename);
  204.     make_usub("erasechar",    US_erasechar,    usersub, filename);
  205.     make_usub("getcap",        US_getcap,    usersub, filename);
  206.     make_usub("getyx",        US_getyx,    usersub, filename);
  207.     make_usub("inch",        US_inch,    usersub, filename);
  208.     make_usub("winch",        US_winch,    usersub, filename);
  209.     make_usub("initscr",    US_initscr,    usersub, filename);
  210.     make_usub("killchar",    US_killchar,    usersub, filename);
  211.     make_usub("leaveok",    US_leaveok,    usersub, filename);
  212.     make_usub("longname",    US_longname,    usersub, filename);
  213.     make_usub("fullname",    US_fullname,    usersub, filename);
  214.     make_usub("mvwin",        US_mvwin,    usersub, filename);
  215.     make_usub("newwin",        US_newwin,    usersub, filename);
  216.     make_usub("nl",        US_nl,        usersub, filename);
  217.     make_usub("nonl",        US_nonl,    usersub, filename);
  218.     make_usub("scrollok",    US_scrollok,    usersub, filename);
  219.     make_usub("subwin",        US_subwin,    usersub, filename);
  220.     make_usub("touchline",    US_touchline,    usersub, filename);
  221.     make_usub("touchoverlap",    US_touchoverlap,usersub, filename);
  222.     make_usub("touchwin",    US_touchwin,    usersub, filename);
  223.     make_usub("unctrl",        US_unctrl,    usersub, filename);
  224.     make_usub("gettmode",    US_gettmode,    usersub, filename);
  225.     make_usub("mvcur",        US_mvcur,    usersub, filename);
  226.     make_usub("scroll",        US_scroll,    usersub, filename);
  227.     make_usub("savetty",    US_savetty,    usersub, filename);
  228.     make_usub("resetty",    US_resetty,    usersub, filename);
  229.     make_usub("setterm",    US_setterm,    usersub, filename);
  230.     make_usub("tstp",        US_tstp,    usersub, filename);
  231.     make_usub("_putchar",    US__putchar,    usersub, filename);
  232.     make_usub("testcallback",    US_testcallback,usersub, filename);
  233. };
  234.  
  235. static int
  236. usersub(ix, sp, items)
  237. int ix;
  238. register int sp;
  239. register int items;
  240. {
  241.     STR **st = stack->ary_array + sp;
  242.     register int i;
  243.     register char *tmps;
  244.     register STR *Str;        /* used in str_get and str_gnum macros */
  245.  
  246.     switch (ix) {
  247. CASE int addch
  248. I    char        ch
  249. END
  250.  
  251. CASE int waddch
  252. I    WINDOW*        win
  253. I    char        ch
  254. END
  255.  
  256. CASE int addstr
  257. I    char*        str
  258. END
  259.  
  260. CASE int waddstr
  261. I    WINDOW*        win
  262. I    char*        str
  263. END
  264.  
  265. CASE void box
  266. I    WINDOW*        win
  267. I    char        vert
  268. I    char        hor
  269. END
  270.  
  271. CASE int clear
  272. END
  273.  
  274. CASE int wclear
  275. I    WINDOW*        win
  276. END
  277.  
  278. CASE int clearok
  279. I    WINDOW*        win
  280. I    bool        boolf
  281. END
  282.  
  283. CASE void clrtobot
  284. END
  285.  
  286. CASE void wclrtobot
  287. I    WINDOW*        win
  288. END
  289.  
  290. CASE void clrtoeol
  291. END
  292.  
  293. CASE void wclrtoeol
  294. I    WINDOW*        win
  295. END
  296.  
  297. CASE int delch
  298. END
  299.  
  300. CASE int wdelch
  301. I    WINDOW*        win
  302. END
  303.  
  304. CASE int deleteln
  305. END
  306.  
  307. CASE int wdeleteln
  308. I    WINDOW*        win
  309. END
  310.  
  311. CASE void erase
  312. END
  313.  
  314. CASE void werase
  315. I    WINDOW*        win
  316. END
  317.  
  318. CASE int flushok
  319. I    WINDOW*        win
  320. I    bool        boolf
  321. END
  322.  
  323. CASE void idlok
  324. I    WINDOW*        win
  325. I    bool        boolf
  326. END
  327.  
  328. CASE int insch
  329. I    char        c
  330. END
  331.  
  332. CASE int winsch
  333. I    WINDOW*        win
  334. I    char        c
  335. END
  336.  
  337. CASE void insertln
  338. END
  339.  
  340. CASE void winsertln
  341. I    WINDOW*        win
  342. END
  343.  
  344. CASE int move
  345. I    int        y
  346. I    int        x
  347. END
  348.  
  349. CASE int wmove
  350. I    WINDOW*        win
  351. I    int        y
  352. I    int        x
  353. END
  354.  
  355. CASE void overlay
  356. I    WINDOW*        win1
  357. I    WINDOW*        win2
  358. END
  359.  
  360. CASE void overwrite
  361. I    WINDOW*        win1
  362. I    WINDOW*        win2
  363. END
  364.  
  365.     case US_printw:
  366.     if (items < 1)
  367.         fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
  368.     else {
  369.         int retval;
  370.         STR*    str =        str_new(0);
  371.  
  372.         do_sprintf(str, items - 1, st + 1);
  373.         retval = addstr(str->str_ptr);
  374.         str_numset(st[0], (double) retval);
  375.         str_free(str);
  376.     }
  377.     return sp;
  378.  
  379.     case US_wprintw:
  380.     if (items < 2)
  381.         fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
  382.     else {
  383.         int retval;
  384.         STR*    str =        str_new(0);
  385.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  386.  
  387.         do_sprintf(str, items - 1, st + 1);
  388.         retval = waddstr(win, str->str_ptr);
  389.         str_numset(st[0], (double) retval);
  390.         str_free(str);
  391.     }
  392.     return sp;
  393.  
  394. CASE int refresh
  395. END
  396.  
  397. CASE int wrefresh
  398. I    WINDOW*        win
  399. END
  400.  
  401. CASE int standout
  402. END
  403.  
  404. CASE void wstandout
  405. I    WINDOW*        win
  406. END
  407.  
  408. CASE int standend
  409. END
  410.  
  411. CASE void wstandend
  412. I    WINDOW*        win
  413. END
  414.  
  415. CASE int cbreak
  416. END
  417.  
  418. CASE int nocbreak
  419. END
  420.  
  421. CASE int echo
  422. END
  423.  
  424. CASE int noecho
  425. END
  426.  
  427.     case US_getch:
  428.         if (items != 0)
  429.             fatal("Usage: &getch()");
  430.         else {
  431.             int retval;
  432.         char retch;
  433.  
  434.             retval = getch();
  435.         if (retval == EOF)
  436.         st[0] = &str_undef;
  437.         else {
  438.         retch = retval;
  439.         str_nset(st[0], &retch, 1);
  440.         }
  441.         }
  442.         return sp;
  443.  
  444.     case US_wgetch:
  445.         if (items != 1)
  446.             fatal("Usage: &wgetch($win)");
  447.         else {
  448.             int retval;
  449.         char retch;
  450.             WINDOW*     win =           *(WINDOW**)     str_get(st[1]);
  451.  
  452.             retval = wgetch(win);
  453.         if (retval == EOF)
  454.         st[0] = &str_undef;
  455.         else {
  456.         retch = retval;
  457.         str_nset(st[0], &retch, 1);
  458.         }
  459.         }
  460.         return sp;
  461.  
  462. CASE int getstr
  463. IO    char*        str
  464. END
  465.  
  466. CASE int wgetstr
  467. I    WINDOW*        win
  468. IO    char*        str
  469. END
  470.  
  471. CASE int raw
  472. END
  473.  
  474. CASE int noraw
  475. END
  476.  
  477. CASE int baudrate
  478. END
  479.  
  480. CASE void delwin
  481. I    WINDOW*        win
  482. END
  483.  
  484. CASE void endwin
  485. END
  486.  
  487. CASE int erasechar
  488. END
  489.  
  490.     case US_getcap:
  491.     if (items != 1)
  492.         fatal("Usage: &getcap($str)");
  493.     else {
  494.         char* retval;
  495.         char*    str =        (char*)        str_get(st[1]);
  496.         char output[50], *outputp = output;
  497.  
  498.         retval = tgetstr(str, &outputp);
  499.         str_set(st[0], (char*) retval);
  500.     }
  501.     return sp;
  502.  
  503.     case US_getyx:
  504.     if (items != 3)
  505.         fatal("Usage: &getyx($win, $y, $x)");
  506.     else {
  507.         int retval;
  508.         STR*    str =        str_new(0);
  509.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  510.         int        y;
  511.         int        x;
  512.  
  513.         do_sprintf(str, items - 1, st + 1);
  514.         retval = getyx(win, y, x);
  515.         str_numset(st[2], (double)y);
  516.         str_numset(st[3], (double)x);
  517.         str_numset(st[0], (double) retval);
  518.         str_free(str);
  519.     }
  520.     return sp;
  521.  
  522.     
  523. CASE int inch
  524. END
  525.  
  526. CASE int winch
  527. I    WINDOW*        win
  528. END
  529.  
  530. CASE WINDOW* initscr
  531. END
  532.  
  533. CASE int killchar
  534. END
  535.  
  536. CASE int leaveok
  537. I    WINDOW*        win
  538. I    bool        boolf
  539. END
  540.  
  541. CASE char* longname
  542. I    char*        termbuf
  543. IO    char*        name
  544. END
  545.  
  546. CASE int fullname
  547. I    char*        termbuf
  548. IO    char*        name
  549. END
  550.  
  551. CASE int mvwin
  552. I    WINDOW*        win
  553. I    int        y
  554. I    int        x
  555. END
  556.  
  557. CASE WINDOW* newwin
  558. I    int        lines
  559. I    int        cols
  560. I    int        begin_y
  561. I    int        begin_x
  562. END
  563.  
  564. CASE int nl
  565. END
  566.  
  567. CASE int nonl
  568. END
  569.  
  570. CASE int scrollok
  571. I    WINDOW*        win
  572. I    bool        boolf
  573. END
  574.  
  575. CASE WINDOW* subwin
  576. I    WINDOW*        win
  577. I    int        lines
  578. I    int        cols
  579. I    int        begin_y
  580. I    int        begin_x
  581. END
  582.  
  583. CASE void touchline
  584. I    WINDOW*        win
  585. I    int        y
  586. I    int        startx
  587. I    int        endx
  588. END
  589.  
  590. CASE void touchoverlap
  591. I    WINDOW*        win1
  592. I    WINDOW*        win2
  593. END
  594.  
  595. CASE void touchwin
  596. I    WINDOW*        win
  597. END
  598.  
  599. CASE char* unctrl
  600. I    char        ch
  601. END
  602.  
  603. CASE void gettmode
  604. END
  605.  
  606. CASE void mvcur
  607. I    int        lasty
  608. I    int        lastx
  609. I    int        newy
  610. I    int        newx
  611. END
  612.  
  613. CASE int scroll
  614. I    WINDOW*        win
  615. END
  616.  
  617. CASE int savetty
  618. END
  619.  
  620. CASE void resetty
  621. END
  622.  
  623. CASE int setterm
  624. I    char*        name
  625. END
  626.  
  627. CASE void tstp
  628. END
  629.  
  630. CASE int _putchar
  631. I    char        ch
  632. END
  633.  
  634.     case US_testcallback:
  635.     sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
  636.     break;
  637.  
  638.     default:
  639.     fatal("Unimplemented user-defined subroutine");
  640.     }
  641.     return sp;
  642. }
  643.  
  644. static int
  645. userval(ix, str)
  646. int ix;
  647. STR *str;
  648. {
  649.     switch (ix) {
  650.     case UV_COLS:
  651.     str_numset(str, (double)COLS);
  652.     break;
  653.     case UV_Def_term:
  654.     str_set(str, Def_term);
  655.     break;
  656.     case UV_ERR:
  657.     str_numset(str, (double)ERR);
  658.     break;
  659.     case UV_LINES:
  660.     str_numset(str, (double)LINES);
  661.     break;
  662.     case UV_My_term:
  663.     str_numset(str, (double)My_term);
  664.     break;
  665.     case UV_OK:
  666.     str_numset(str, (double)OK);
  667.     break;
  668.     case UV_curscr:
  669.     str_nset(str, &curscr, sizeof(WINDOW*));
  670.     break;
  671.     case UV_stdscr:
  672.     str_nset(str, &stdscr, sizeof(WINDOW*));
  673.     break;
  674.     case UV_ttytype:
  675.     str_set(str, ttytype);
  676.     break;
  677.     }
  678.     return 0;
  679. }
  680.  
  681. static int
  682. userset(ix, str)
  683. int ix;
  684. STR *str;
  685. {
  686.     switch (ix) {
  687.     case UV_COLS:
  688.     COLS = (int)str_gnum(str);
  689.     break;
  690.     case UV_Def_term:
  691.     Def_term = savestr(str_get(str));    /* never freed */
  692.     break;
  693.     case UV_LINES:
  694.     LINES = (int)str_gnum(str);
  695.     break;
  696.     case UV_My_term:
  697.     My_term = (bool)str_gnum(str);
  698.     break;
  699.     case UV_ttytype:
  700.     strcpy(ttytype, str_get(str));        /* hope it fits */
  701.     break;
  702.     }
  703.     return 0;
  704. }
  705.